home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / pascala.zip / POLY.PAS < prev    next >
Pascal/Delphi Source File  |  1980-01-01  |  11KB  |  395 lines

  1. (***********************************************************)
  2. (*    PROGRAM Poly which will serve as a main program for  *)
  3. (*    various operations on polynomials.  Several of these *)
  4. (*    are currently implemented as stubs.                  *)
  5. (*                    by  PRB 2/91                         *)
  6. (***********************************************************)
  7. PROGRAM Poly(Input,Output);
  8.  
  9.   TYPE   ExpType = 0..Maxint;
  10.          TermPtr = ^TermType;
  11.          TermType = RECORD
  12.                       Coef: Integer;
  13.                       Exp: ExpType;
  14.                       Next: TermPtr;
  15.                     END;
  16.  
  17.   VAR  Poly1,Poly2,Sum,Prod,Sub,Deriv,Mon,
  18.        Work,Temp,MonPoly1,MonPoly2,p1,q1,p2,q2: TermPtr;
  19.  
  20. (***********************************************************)
  21. (* Auxilliary procedure for spacing output                 *)
  22. (***********************************************************)
  23. PROCEDURE PrintBlankLines(N:Integer);
  24.   VAR I: Integer;
  25.   BEGIN
  26.   FOR I:= 1 TO N DO Writeln;
  27.   END;
  28. (*********************************************************)
  29. (*  Creates a term with given coefficient and exponent   *)
  30. (*********************************************************)
  31.   PROCEDURE MakeTerm(Coef:Integer; Exp:ExpType);
  32.     BEGIN
  33.     END;
  34. (********************************************************)
  35. (* Pre: The monomial has been created                   *)
  36. (* Post: The monomial is written to the screen          *)
  37. (********************************************************)
  38. PROCEDURE WriteMon(Mon:TermPtr);
  39.   BEGIN
  40.   IF (Mon = nil) THEN Writeln('  0');
  41.   IF (Mon^.coef>0) THEN     (* WRITE SIGN *)
  42.     Write('+')
  43.   ELSE
  44.     Write(' - ');
  45.   WITH Mon^ DO
  46.   IF Exp = 0 THEN    (* WRITE TERM *)
  47.     Write(Abs(Coef):1)
  48.   ELSE
  49.     IF Exp = 1 THEN
  50.       Write(Abs(Coef):1,'*X')
  51.     ELSE
  52.       Write(Abs(Coef):1,'*X^',Exp:1);
  53. Writeln;
  54. END;
  55. (*********************************************************)
  56. (* Pre: The polynomial has been created                  *)
  57. (* Post: The polynomial is written to the screen         *)
  58. (*********************************************************)
  59. PROCEDURE WritePoly(Poly:TermPtr);
  60.   VAR P: TermPtr;
  61.  
  62.   BEGIN
  63.   P:=Poly^.Next;
  64.   IF (P = nil) THEN Writeln('  0');
  65.   WHILE (P<> NIL) DO
  66.     BEGIN
  67.     IF (P^.Coef>0) THEN    (* Write sign *)
  68.       Write(' + ')
  69.     ELSE
  70.       Write(' - ');
  71.     WITH P^ DO
  72.     IF Exp = 0 THEN      (* Write term *)
  73.       Write(Abs(Coef):1)
  74.     ELSE
  75.       IF Exp = 1 THEN
  76.         Write(Abs(Coef):1,'*X')
  77.       ELSE
  78.         Write(Abs(Coef):1,'*X^',Exp:1);
  79.     P:= P^.Next;
  80.     END;  (** WHILE **)
  81.   Writeln;
  82.   END;
  83. (***********************************************************)
  84. (*  Pre:  Zero Poly must exist.                            *)
  85. (*  Post: The user has supplied the coefficients           *)
  86. (*        for a polynomial.                                *)
  87. (***********************************************************)
  88. PROCEDURE ReadPoly(VAR Poly: TermPtr);
  89.   VAR  P:  TermPtr;
  90.        Coef: Integer;
  91.        Exp: ExpType;
  92.  
  93.   BEGIN
  94.   Writeln;
  95.   Writeln('Enter the coefficients and Exps of the polynomial');
  96.   Writeln('in descending order.  To exit, enter a zero coeficient.');
  97.   Writeln('Coef, Exp');
  98.   Readln(Coef,Exp);
  99.   P:= Poly;
  100.   WHILE Coef<>0 DO
  101.     BEGIN
  102.     New(P^.Next);
  103.     P:= P^.Next;
  104.     P^.Coef:= Coef;
  105.     P^.Exp:= Exp;
  106.     Writeln('Coef, Exp');
  107.     Readln(Coef, Exp);
  108.     END;
  109.   P^.Next:= nil;
  110.   END;
  111. (******************************************************)
  112. (* Pre: Poly1, Poly2, exist                           *)
  113. (* Post: The user suplied the monomial                *)
  114. (******************************************************)
  115. PROCEDURE ReadMon(VAR Mon:TermPtr);
  116. VAR     M : TermPtr;
  117.         coef : Integer;
  118.         Exp : Exptype;
  119. BEGIN
  120.   Writeln;
  121.   Writeln('Enter the coefficient and Exp of the monomial');
  122.   Writeln('Coef, Exp');
  123.   Readln(Coef,Exp);
  124.   New(M);
  125.   M := Mon;
  126.   M^.Coef := Coef;
  127.   M^.Exp  := Exp;
  128.   M^.Next := nil;
  129. END;
  130. (******************************************************)
  131. (* Pre: Poly1, Poly2, and Sum exist.                  *)
  132. (* Post: Sum has been formed from Poly1, Poly2        *)
  133. (******************************************************)
  134. PROCEDURE AddPolys(Poly1,Poly2:TermPtr; VAR Sum:TermPtr);
  135. VAR     P1,P2,S: TermPtr;
  136.         Sumcoef: Integer;
  137.  
  138. BEGIN           (* Initialize *)
  139. P1:= Poly1^.Next;
  140. P2:= Poly2^.Next;
  141. S:= Sum;
  142.  
  143. WHILE (P1<>nil) AND (P2<>nil) DO
  144.   BEGIN
  145.   IF P1^.Exp = P2^.Exp THEN
  146.     BEGIN                              (* Add Like terms *)
  147.     Sumcoef:= P1^.coef + P2^.coef;
  148.     IF (Sumcoef<>0) THEN
  149.       BEGIN
  150.       New(S^.Next);
  151.       S:= S^.Next;
  152.       S^.coef:= Sumcoef;
  153.       S^.Exp:= P1^.Exp;
  154.       END;
  155.     P1:= P1^.Next;
  156.     P2:= P2^.Next;
  157.     END
  158.   ELSE
  159.     BEGIN                       (* Lone term cases *)
  160.     new(S^.Next);               (* copy a single term to sum *)
  161.     S:= S^.Next;
  162.     IF P1^.Exp > P2^.Exp THEN
  163.       BEGIN
  164.       S^:= P1^;
  165.       P1:= P1^.Next;
  166.       END
  167.     ELSE
  168.       BEGIN
  169.       S^:= P2^;
  170.       P2:= P2^.Next;
  171.       END;
  172.     END;
  173.   END;
  174.  
  175. WHILE (P1<>nil) DO        (* Append any remaining  *)
  176.   BEGIN                   (* terms to sum  *)
  177.   New(S^.Next);
  178.   S:= S^.Next;
  179.   S^:= P1^;
  180.   P1:= P1^.Next;
  181.   END;
  182. WHILE (P2<>nil) DO
  183.   BEGIN
  184.   New(S^.Next);
  185.   S:= S^.Next;
  186.   S^:= P2^;
  187.   P2:= P2^.Next;
  188.   END;
  189. END;
  190.  
  191. (***************************************************************)
  192. (*  Pre: Poly1, Poly2 and Sum exist.                           *)
  193. (*  Post: Sum has been formed from Poly1, Poly2                *)
  194. (***************************************************************)
  195. (*     Subtract Procedure    *)
  196. PROCEDURE SubPolys(Poly1,Poly2:TermPtr; VAR Sub:TermPtr);
  197. VAR     P1,P2,Sb: TermPtr;
  198.         Sumcoef: Integer;
  199.  
  200. BEGIN           (* Initialize *)
  201. P1:= Poly1^.Next;
  202. P2:= Poly2^.Next;
  203. Sb:= Sub;
  204.  
  205. WHILE (P1<>nil) AND (P2<>nil) DO
  206.   BEGIN
  207.   IF P1^.Exp = P2^.Exp THEN
  208.     BEGIN                              (* Subtract Like terms *)
  209.     Sumcoef:= P1^.coef - P2^.coef;
  210.     IF (Sumcoef<>0) THEN
  211.       BEGIN
  212.       New(Sb^.Next);
  213.       Sb:= Sb^.Next;
  214.       Sb^.coef:= Sumcoef;
  215.       Sb^.Exp:= P1^.Exp;
  216.       END;
  217.     P1:= P1^.Next;
  218.     P2:= P2^.Next;
  219.     END
  220.   ELSE
  221.     BEGIN                       (* Lone term cases *)
  222.     new(Sb^.Next);               (* copy a single term to sub *)
  223.     Sb:= Sb^.Next;
  224.     IF P1^.Exp > P2^.Exp THEN
  225.       BEGIN
  226.       Sb^:= P1^;
  227.       P1:= P1^.Next;
  228.       END
  229.     ELSE
  230.       BEGIN
  231.       P2:= P2^.Next;
  232.       END;
  233.     END;
  234.   END;
  235.  
  236. WHILE (P1<>nil) DO        (* Append any remaining  *)
  237.   BEGIN                   (* terms to sub  *)
  238.   New(Sb^.Next);
  239.   Sb:= Sb^.Next;
  240.   Sb^:= P1^;
  241.   P1:= P1^.Next;
  242.   END;
  243. WHILE (P2<>nil) DO
  244.   BEGIN
  245.   New(Sb^.Next);
  246.   Sb:= Sb^.Next;
  247.   Sb^:= P2^;
  248.   P2:= P2^.Next;
  249.   END;
  250. END;
  251. (***********************************************************)
  252. (*  Multiplies monomial and a polynomial. The product is   *)
  253. (*  pointed to by Prod1 and Prod2.                         *)
  254. (***********************************************************)
  255. PROCEDURE MultMon(Poly1,Poly2,Mon : TermPtr; VAR MonPoly1,MonPoly2 : TermPtr);
  256. VAR     P1,P2,Prod1,Prod2:TermPtr;
  257.         Prodcoef         : Integer;
  258. BEGIN
  259.   P1 := Poly1^.Next;
  260.   P2 := Poly2^.Next;
  261.   Prod1 := MonPoly1;
  262.   Prod2 := MonPoly2;
  263.     While (P1 <> nil) OR (P2 <> nil) DO
  264.       BEGIN
  265.         IF (P1 <> nil) THEN
  266.           BEGIN
  267.             Prodcoef := Mon^.coef * P1^.coef;
  268.               IF (Prodcoef <> 0) THEN
  269.                 BEGIN
  270.                   New(Prod1^.Next);
  271.                   Prod1 := Prod1^.Next;
  272.                   Prod1^.coef := Prodcoef;
  273.                   Prod1^.Exp  := P1^.Exp + Mon^.Exp;
  274.                 END; {IF}
  275.             P1 := P1^.Next;
  276.           END; { IF }
  277.         IF (P2 <> nil) THEN
  278.           BEGIN {IF}
  279.             Prodcoef := Mon^.coef * P2^.coef;
  280.               IF (Prodcoef <> 0) THEN
  281.                 BEGIN {IF}
  282.                   New(Prod2^.Next);
  283.                   Prod2 := Prod2^.Next;
  284.                   Prod2^.coef := Prodcoef;
  285.                   Prod2^.Exp := P2^.Exp + Mon^.Exp;
  286.                 END; {IF }
  287.             P2 := P2^.Next;
  288.           END;{IF}
  289.       END; {WHILE}
  290. END;
  291. (***********************************************************)
  292. (*  Multiplies two polynomials pointed to by               *)
  293. (*  Poly1 and Poly2. The product is pointed                *)
  294. (*  to by Prod.                                            *)
  295. (***********************************************************)
  296.  
  297. PROCEDURE MultPolys(VAR Poly1,Poly2,Prod:TermPtr);
  298. VAR P1,P2,hold,H,temp: TermPtr;
  299.     Prodcoef,Pexe :integer;
  300.  
  301. BEGIN {MultPolys}
  302. New(temp);
  303. New(H);
  304. New(hold);
  305. H := hold;
  306. P2 := Poly2^.next;
  307.  
  308. WHILE P2 <> NIL DO
  309.   BEGIN
  310.   P1 := Poly1^.next;
  311.   WHILE P1 <> NIL DO
  312.     BEGIN
  313.     Pexe := P1^.exp + P2^.exp;    (* add the exponents *)
  314.     Prodcoef := P1^.coef * P2^.coef; (* multiply the coeficents *)
  315.     temp^.exp := Pexe;
  316.     temp^.coef := Prodcoef;
  317.     hold^.next := temp;
  318.     P1 := P1^.next;
  319.     Addpolys(H,Prod,Prod);       (* Simplify by adding *)
  320.     END;
  321.   P2 := P2^.next;    
  322. END;
  323. END; {MultPolys}
  324.  
  325. (***********************************************************)
  326. (* Pre: None.                                              *)
  327. (* Post: All Polynomials have been initialized to zero     *)
  328. (***********************************************************)
  329. PROCEDURE Initialize(VAR Poly1,Poly2,Sum,Prod,Deriv,Mon: TermPtr);
  330. BEGIN
  331. New(Poly1);
  332. New(Poly2);
  333. New(Sum);
  334. New(Sub);
  335. New(Prod);
  336. New(Deriv);
  337. New(Mon);
  338. New(MonPoly1);
  339. New(MonPoly2);
  340.  
  341. Poly1^.Next:= nil;
  342. Poly2^.Next:= nil;
  343. Sum^.Next:= nil;
  344. Sub^.Next:= nil;
  345. Prod^.Next:= nil;
  346. Deriv^.Next:= nil;
  347. Mon^.Next:= nil;
  348. MonPoly1^.Next := nil;
  349. MonPoly2^.Next := nil;
  350. END;
  351. (***********************************************************)
  352. (*************************** MAIN **************************)
  353. BEGIN
  354. Initialize(Poly1,Poly2,Sum,Prod,Deriv,Mon);
  355. (* Describe *)
  356. PrintBlankLines(5);
  357. ReadPoly(Poly1);
  358. Writeln('The first polynomial is:');
  359. WritePoly(Poly1);
  360. Writeln;
  361. ReadPoly(Poly2);
  362. Writeln('The second polynomial is:');
  363. WritePoly(Poly2);
  364. Writeln('Enter Monomial.');
  365. ReadMon(Mon);
  366. Writeln('The Monomial is:');
  367. WriteMon(Mon);
  368. PrintBlankLines(5);
  369.  
  370. AddPolys(Poly1,Poly2,Sum);
  371. Writeln('The sum of the two Polynomials is:');
  372. Writepoly(Sum);
  373. PrintBlankLines(2);
  374.  
  375. SubPolys(Poly1,Poly2,Sub);
  376. Writeln('The subtraction of the two Polynomials is:');
  377. Writepoly(Sub);
  378. PrintBlankLines(2);
  379.  
  380. MultMon(Poly1,Poly2,Mon,MonPoly1,MonPoly2);
  381. Writeln('The Product of the monomial and the polynomial #1 is:');
  382. WritePoly(MonPoly1);
  383. PrintBlankLines(2);
  384. Writeln('The Product of the monomial and the polynomial #2 is:');
  385. WritePoly(MonPoly2);
  386. PrintBlankLines(2);
  387.  
  388. MultPolys(Poly1,Poly2,Prod);
  389. Writeln('The Product of the two polynomials is:');
  390. WritePoly(Prod);
  391. PrintBlankLines(1);
  392.  
  393. END.
  394. (********************************************************)
  395.